package com.example.mq.common;

import java.io.*;

// 序列化/反序列化 工具类
// 使用 Java 标准库的工具类进行对象的序列化和反序列化, 需要实现 Serializable 接口
public class BinaryTool {
    // 把一个对象序列化成一个字节数组
    public static byte[] toByte(Object object) throws IOException {
        // 这个流对象相当于一个变长的字节数组
        // 可以将 object 对象序列化的数据逐渐写到 byteArrayOutputStream 中, 再统一转成 byte[] 中
        try(ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream()) {
            try(ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream)) {
                // 此处的 writeObject 就会把该对象进行序列化, 生成的二进制字节数据, 写入到 ObjectOutputStream 中
                // 由于 ObjectOutputStream 关联到 ByteArrayOutputStream, 结果最终就写入到 ByteArrayOutputStream 中
                objectOutputStream.writeObject(object);
            }
            // toByteArray() 可以将 ByteArrayOutputStream 中持有的二进制数据取出来, 转成 byte[]
            return byteArrayOutputStream.toByteArray();
        }
    }

    // 把一个字节数组反序列化成一个对象
    public static Object fromByte(byte[] data) throws IOException, ClassNotFoundException {
        Object object = null;
        try(ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(data)) {
            try(ObjectInputStream objectInputStream = new ObjectInputStream(byteArrayInputStream)) {
                // 此处的 readObject(), 可以从 data 中读取数据, 并且反序列化成 Object 对象
                object = objectInputStream.readObject();
            }
        }
        return object;
    }
}
